package com.baseframe.auth.support;




import com.baseframe.tool.utils.encrypt.Argon2Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * 哈希算法加密与匹配
 */
@Slf4j
public class BaseArgon2PasswordEncoder implements PasswordEncoder {


    /**
     * 这段代码实现了一个自定义的密码加密器(BaseArgon2PasswordEncoder)，它实现了Spring Security中的PasswordEncoder接口。
     *
     * 导入了一些工具类和依赖包。
     *
     * 添加了@Slf4j注解，即使用Slf4j记录日志。
     *
     * 实现了PasswordEncoder接口中的两个方法：
     *
     * 1. encode()方法用于对原始密码进行加密。首先，判断原始密码是否为空，如果为空则抛出异常。然后，调用Argon2Util.noPrefixEncoded()方法对原始密
     * 码进行加密处理，并返回加密后的密码。
     *
     * 2. matches()方法用于比较原始密码和已加密的密码是否相匹配。首先，判断原始密码和已加密的密码是否为空，如果有为空的情况则抛出异常。然后，调用
     * Argon2Util.possessPrefix2EncodedStr()方法对已加密的密码进行处理，得到拼接后的密码。最后，调用Argon2Util.matches()方法比较原始密码和加
     * 密后的密码是否匹配，返回匹配结果。
     *
     * 这个密码加密器使用了Argon2Util工具类来实现加密和验证密码的功能，Argon2是一种密码哈希算法，具有较高的安全性和抗攻击性能。通过自定义
     * PasswordEncoder，可以在Spring Security中使用Argon2进行密码加密和验证。*/



    @Override
    public String encode(CharSequence rawPassword) {
        //
        if (rawPassword == null) {
            throw new IllegalArgumentException("原文内容为空");
        }
        return Argon2Util.noPrefixEncoded((String) rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        if (rawPassword == null||encodedPassword==null) {
            throw new IllegalArgumentException("原文或加密内容为空");
        }
        //2.Argon2拼接密码
        String prefix2EncodedStr = Argon2Util.possessPrefix2EncodedStr(encodedPassword);
        return Argon2Util.matches(prefix2EncodedStr, (String) rawPassword);
    }

//    public static void main(String[] args) {
//        String encode = new BaseArgon2PasswordEncoder().encode("e10adc3949ba59abbe56e057f20f883e");
//        System.out.println(encode);
//    }

//    public static void main(String[] args) {
//        BaseArgon2PasswordEncoder passwordEncoder = new BaseArgon2PasswordEncoder();
////        String encode = passwordEncoder.encode("21232f297a57a5a743894a0e4a801fc3");
////        System.out.println(encode);
//        boolean matches = passwordEncoder.matches("e10adc3949ba59abbe56e057f20f883e", "niXoqSGAdm1k4f7zq8YJ4Q$WUdDqknomn1WRN9BJ3o5YIegCU+Aqk5OTz4U4lLRhhE");
//        System.out.println(matches);
//    }
}
